package com.ybf.api.utils;


import com.fasterxml.jackson.databind.ObjectMapper;
import org.modelmapper.ModelMapper;

import java.io.UnsupportedEncodingException;
import java.net.URI;
import java.net.URLDecoder;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;

public class Utils {
    /**
     * 将Map对象转换为指定类的实例
     *
     * @param obj 目标类的Class对象，用于指定转换后的对象类型
     * @param map 包含目标对象属性数据的Map对象
     * @return 返回转换后的目标类实例对象
     */
    public static Object mapToObject(Class obj, Object map) {
        // 创建ModelMapper实例，用于执行映射操作
        ModelMapper modelMapper = new ModelMapper();
        // 使用ModelMapper的map方法将Map对象转换为目标类的实例，并返回
        return modelMapper.map(map, obj);
    }


    /**
     * 将下划线风格的字符串转换为驼峰风格
     * 该方法主要用于将数据库表名（通常为下划线风格）转换为编程变量名（通常为驼峰风格）
     *
     * @param underscoreStr 下划线风格的字符串，例如"first_name"或"first-name"
     * @return 转换后的驼峰风格字符串，例如"firstName"
     */
    public static String toCamelCase(String underscoreStr) {
        // 使用StringBuilder来高效地构建字符串
        StringBuilder camelCaseStr = new StringBuilder();
        // 标记是否下一个字符应该大写
        boolean nextUpperCase = false;

        // 遍历输入字符串的每个字符
        for (char c : underscoreStr.toCharArray()) {
            // 如果遇到下划线，表示下一个字符应该大写
            if (c == '_') {
                nextUpperCase = true;
            } else {
                // 如果nextUpperCase为true，将字符转为大写并添加到结果字符串中
                if (nextUpperCase) {
                    camelCaseStr.append(Character.toUpperCase(c));
                    nextUpperCase = false;
                } else {
                    // 如果是第一个字符，将其转为小写并添加到结果字符串中；其他情况直接添加
                    camelCaseStr.append(camelCaseStr.length() == 0 ? Character.toLowerCase(c) : c);
                }
            }
        }

        // 返回构建好的驼峰风格字符串
        return camelCaseStr.toString();
    }

    public static Map<String, String> parseQuery(String query) throws UnsupportedEncodingException {
        Map<String, String> queryPairs = new HashMap<>();
        String[] pairs = query.split("&");
        for (String pair : pairs) {
            int idx = pair.indexOf("=");
            queryPairs.put(
                    URLDecoder.decode(pair.substring(0, idx), StandardCharsets.UTF_8.toString()),
                    URLDecoder.decode(pair.substring(idx + 1), StandardCharsets.UTF_8.toString())
            );
        }
        return queryPairs;
    }


    public static Object jsonToObject(String jsonStr, Class clazz) {
        ObjectMapper objectMapper = new ObjectMapper();
        try {
            return objectMapper.readValue(jsonStr, clazz);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}